//
// Created by wangliewei on 2021/8/12.
//
/*
可以联想到树的后序遍历，主要操作都是在递归地处理完左右分支之后进行的，
是稳定的

快排不是稳定的，如果想变成稳定的，那就弄个二元组，第二维是位置

*/


#include <iostream>
using namespace std;

const int N = 1e6 + 10;

int q[N];
int tmp[N];

void merge_sort(int q[],int l, int r){

    if (l >= r) return;
    int mid = l + r >>1;
    merge_sort(q, l, mid);
    merge_sort(q, mid + 1, r);

    int k = 0, i = l, j = mid +1;
    while (i <= mid && j <= r) {
        if (q[i] <= q[j]) tmp[k++] = q[i++];
        else tmp[k++]=q[j++];
    }
    while (i <= mid) tmp[k++]=q[i++];
    while (j <= r) tmp[k++]=q[j++];

    for (int i = l, j = 0; i <= r; i++,j++) { //注意了，这里i是从l开始
        q[i] = tmp[j];
    }

}

int main(){

    int n;

    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &q[i]);
    }

    merge_sort(q, 0, n - 1);

    for (int i = 0; i < n; i++) {
        printf("%d ", q[i]);
    }

    return 0;
}







